import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './routes';
import store from '@/store';

Vue.use(VueRouter);

//因为编程式路由导航重复导航的是时候 会报错,我们需要重写push和replace解决这个问题
//1. 保存旧的push方法
const oldPushMethod = VueRouter.prototype.push;
//2. 覆盖原来的push方法 重写push
VueRouter.prototype.push = function(location, onComplate = () => {},
    onAbort = () => {}) {
  //内部使用的还是以前的push方法,但是我们给添加了处理异常的回调函数
  return oldPushMethod.call(this, location, onComplate, onAbort);
};

//1. 保存旧的replace方法
const oldReplaceMethod = VueRouter.prototype.replace;
//2. 覆盖原来的push方法 重写push
VueRouter.prototype.replace = function(location, onComplate = () => {},
    onAbort = () => {}) {
  //内部使用的还是以前的push方法,但是我们给添加了处理异常的回调函数
  return oldReplaceMethod.call(this, location, onComplate, onAbort);
};

const router = new VueRouter({
  routes, mode: 'history',
});

const whiteList = ['login', 'register', 'home'];

router.beforeEach(async(to, form, next) => {
  const token = store.state.user.token;
  const userinfo = store.state.user.userinfo;

  // 如果去的地方是登录页 而且已经登录过了
  if (to.name === 'login' && token !== '') {
    return next('/home');
  }

  if (!userinfo.nickname && token !== '') {
    // 如果用户数据不存在 但是登录了 重新获取用户数据
    try {
      await store.dispatch('user/getUserInfo');
      return next();
    } catch (err) {
      console.log(err);
    }
  } else {
    // 否则直接登录
    next();
  }

  // 如果存在白名单内
  if (whiteList.includes(to.name)) {
    // 直接放行
    next();
  } else {
    // 去登录页
    alert('请先登录！');
    next(`/login?redirect=${ to.name }`);
  }

});

export default router;
